<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <title>图书管理接口测试用例文档</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            line-height: 1.6;
            margin: 20px;
        }

        h1,
        h2,
        h3 {
            color: #333;
        }

        pre {
            background-color: #f4f4f4;
            padding: 10px;
            border-radius: 5px;
            overflow-x: auto;
        }

        code {
            background-color: #eee;
            padding: 2px 4px;
            border-radius: 3px;
        }

        table {
            border-collapse: collapse;
            width: 100%;
            margin-bottom: 20px;
        }

        th,
        td {
            border: 1px solid #ddd;
            padding: 8px;
            text-align: left;
        }

        th {
            background-color: #f2f2f2;
        }
    </style>
</head>

<body>
    <h1>图书管理接口测试用例文档</h1>
    <p>本测试用例文档适用于对 <code>添加图书</code>、<code>获取所有图书</code>、<code>获取单本图书</code>、<code>更新图书</code>、<code>删除图书</code>
        接口进行功能测试。每个接口都提供了多个正常和异常测试场景，帮助学生掌握边界值分析、等价类划分、错误猜测等测试方法。</p>

    <hr />

    <h2>1. 添加图书 (<code>/books</code>) 测试用例</h2>
    <table>
        <tr>
            <th>编号</th>
            <th>用例描述</th>
            <th>请求方式</th>
            <th>title</th>
            <th>author</th>
            <th>description</th>
            <th>publishedYear</th>
            <th>预期状态码</th>
            <th>预期结果</th>
        </tr>
        <tr>
            <td>B01</td>
            <td>添加成功</td>
            <td>POST</td>
            <td>三体</td>
            <td>刘慈欣</td>
            <td>科幻小说</td>
            <td>2008</td>
            <td>20000</td>
            <td>图书添加成功</td>
        </tr>
        <tr>
            <td>B02</td>
            <td>缺少书名</td>
            <td>POST</td>
            <td>（空）</td>
            <td>刘慈欣</td>
            <td>科幻小说</td>
            <td>2008</td>
            <td>20001</td>
            <td>书名和作者为必填项</td>
        </tr>
        <tr>
            <td>B03</td>
            <td>缺少作者</td>
            <td>POST</td>
            <td>三体</td>
            <td>（空）</td>
            <td>科幻小说</td>
            <td>2008</td>
            <td>20001</td>
            <td>书名和作者为必填项</td>
        </tr>
        <tr>
            <td>B04</td>
            <td>只填必填项</td>
            <td>POST</td>
            <td>活着</td>
            <td>余华</td>
            <td>（空）</td>
            <td>（空）</td>
            <td>20000</td>
            <td>图书添加成功</td>
        </tr>
        <tr>
            <td>B05</td>
            <td>出版年份为负数</td>
            <td>POST</td>
            <td>未来简史</td>
            <td>赫拉利</td>
            <td>历史畅销书</td>
            <td>-2020</td>
            <td>20000</td>
            <td>图书添加成功（允许负数）</td>
        </tr>
        <tr>
            <td>B06</td>
            <td>出版年份为非数字</td>
            <td>POST</td>
            <td>未来简史</td>
            <td>赫拉利</td>
            <td>历史畅销书</td>
            <td>abcd</td>
            <td>50000</td>
            <td>服务器错误</td>
        </tr>
    </table>

    <hr />

    <h2>2. 获取所有图书 (<code>/books</code>) 测试用例</h2>
    <table>
        <tr>
            <th>编号</th>
            <th>用例描述</th>
            <th>请求方式</th>
            <th>预期状态码</th>
            <th>预期结果</th>
        </tr>
        <tr>
            <td>G01</td>
            <td>返回图书列表</td>
            <td>GET</td>
            <td>20000</td>
            <td>返回图书数组</td>
        </tr>
        <tr>
            <td>G02</td>
            <td>无图书时返回空数组</td>
            <td>GET</td>
            <td>20000</td>
            <td>返回空数组</td>
        </tr>
        <tr>
            <td>G03</td>
            <td>POST 请求</td>
            <td>POST</td>
            <td>405</td>
            <td>返回 405 Method Not Allowed</td>
        </tr>
    </table>

    <hr />

    <h2>3. 获取单本图书 (<code>/books/:id</code>) 测试用例</h2>
    <table>
        <tr>
            <th>编号</th>
            <th>用例描述</th>
            <th>请求方式</th>
            <th>id</th>
            <th>预期状态码</th>
            <th>预期结果</th>
        </tr>
        <tr>
            <td>S01</td>
            <td>获取成功</td>
            <td>GET</td>
            <td>1</td>
            <td>20000</td>
            <td>返回对应图书信息</td>
        </tr>
        <tr>
            <td>S02</td>
            <td>图书不存在</td>
            <td>GET</td>
            <td>9999</td>
            <td>20002</td>
            <td>图书未找到</td>
        </tr>
        <tr>
            <td>S03</td>
            <td>id 非数字</td>
            <td>GET</td>
            <td>abc</td>
            <td>50000</td>
            <td>服务器错误</td>
        </tr>
    </table>

    <hr />

    <h2>4. 更新图书 (<code>/books/:id</code>) 测试用例</h2>
    <table>
        <tr>
            <th>编号</th>
            <th>用例描述</th>
            <th>请求方式</th>
            <th>id</th>
            <th>title</th>
            <th>author</th>
            <th>description</th>
            <th>publishedYear</th>
            <th>预期状态码</th>
            <th>预期结果</th>
        </tr>
        <tr>
            <td>U01</td>
            <td>全部字段更新</td>
            <td>PUT</td>
            <td>1</td>
            <td>三体(新版)</td>
            <td>刘慈欣</td>
            <td>新版简介</td>
            <td>2010</td>
            <td>20000</td>
            <td>图书更新成功</td>
        </tr>
        <tr>
            <td>U02</td>
            <td>只更新部分字段</td>
            <td>PUT</td>
            <td>1</td>
            <td>三体2</td>
            <td>（空）</td>
            <td>（空）</td>
            <td>（空）</td>
            <td>20000</td>
            <td>图书更新成功</td>
        </tr>
        <tr>
            <td>U03</td>
            <td>图书不存在</td>
            <td>PUT</td>
            <td>9999</td>
            <td>新版</td>
            <td>新版作者</td>
            <td>新版简介</td>
            <td>2025</td>
            <td>20002</td>
            <td>图书未找到</td>
        </tr>
        <tr>
            <td>U04</td>
            <td>id 非数字</td>
            <td>PUT</td>
            <td>abc</td>
            <td>新版</td>
            <td>新版作者</td>
            <td>新版简介</td>
            <td>2025</td>
            <td>50000</td>
            <td>服务器错误</td>
        </tr>
    </table>

    <hr />

    <h3>📝 提示说明</h3>
    <ul>
        <li><strong>“（空）”</strong> 表示该字段为空或未传</li>
        <li><strong>“返回 405”</strong>：表示请求方法不被允许，用于测试 HTTP 方法安全性</li>
        <li>如需补充边界值、异常类型等可自行扩展</li>
    </ul>
</body>

</html>